package br.com.caelum.vraptor.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.event.ObserverException;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.observer.download.Download;
import br.com.caelum.vraptor.observer.download.FileDownload;
import br.urca.dao.CursoTurnoDAO;
import br.urca.dao.DisciplinaDAO;
import br.urca.dao.DisciplinasCursadasDAO;
import br.urca.dao.DisciplinasMatriculadasDAO;
import br.urca.dao.HabilitacaoDAO;
import br.urca.dao.OfertaDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.model.CoeficienteDeRendimento;
import br.urca.model.CursoTurno;
import br.urca.model.Disciplina;
import br.urca.model.DisciplinaCursada;
import br.urca.model.DisciplinaMatriculada;
import br.urca.model.HabilitacaoPK;
import br.urca.model.HistoricoDisciplina;
import br.urca.model.Oferta;
import br.urca.session.UsuarioLogado;
import br.urca.util.Paths;

@Controller
@InterceptResource
public class IndexController {
	
	public static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
	
	private UsuarioLogado usuarioLogado;
	private HabilitacaoDAO mHabilitacaoDAO;
	private ServletContext context;
	private Result result;
	private HttpServletRequest httpRequest;
	private DisciplinasMatriculadasDAO mMatriculasDAO;
	private DisciplinasCursadasDAO mCursadasDAO;
	private OfertaDAO mOfertaDAO;
	private DisciplinaDAO mDisciplinaDAO;

	public IndexController() { }	
	
	@Inject
	public IndexController(UsuarioLogado usuarioLogado,
			HttpServletRequest httpRequest, HabilitacaoDAO mHabilitacaoDAO,
			ServletContext context, DisciplinaDAO mDisciplinaDAO,
			DisciplinasCursadasDAO mCursadasDAO, 
			Result result, DisciplinasMatriculadasDAO mMatriculasDAO,
			OfertaDAO mOfertaDAO) {
		this.result = result;
		this.context = context;
		this.mHabilitacaoDAO = mHabilitacaoDAO;
		this.usuarioLogado = usuarioLogado;
		this.mOfertaDAO = mOfertaDAO;
		this.mDisciplinaDAO = mDisciplinaDAO;
		this.mMatriculasDAO = mMatriculasDAO;
		this.httpRequest = httpRequest;
		this.mCursadasDAO = mCursadasDAO;
	}
		
	@Path("/")
	public void index() {
		
		String imagem = context.getInitParameter("pathFotos") + "/"
				+ usuarioLogado.getAluno().getMatricula() + ".jpg";		
		
		File file = new File(imagem);
		if (!file.exists()) {
			imagem = "user.png";
		} else {
			imagem = usuarioLogado.getAluno().getMatricula().concat(".jpg");
		}
		
		result.include("alunoCurso", usuarioLogado.getAluno()).include(
				"habilitacao",
				mHabilitacaoDAO.buscarPorId(new HabilitacaoPK(usuarioLogado
						.getAluno().getCurso().getCodCurso(), usuarioLogado
						.getAluno().getHabilitacao())))
				.include(
						"imagem","http://"+
						httpRequest
								.getServerName()
								.concat(":")
								.concat(String.valueOf(httpRequest
										.getServerPort())).concat("/fotos/").concat(imagem));
		
		httpRequest.getSession().setAttribute("foto", "http://"+httpRequest
								.getServerName()
								.concat(":")
								.concat(String.valueOf(httpRequest
										.getServerPort())).concat("/fotos/").concat(imagem));
		
	}
	
	@Get("/arquivos/manualaluno")
	public Download downloadManual() {
		
		try {
			String path = context.getRealPath("/WEB-INF/files/");
			File relatorio = new File(path+"/ManualAcademico_vrs2009.pdf"); 
			return new FileDownload(relatorio, httpRequest.getServletContext().getMimeType(relatorio.getName()), "manualaluno.pdf", false);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} 
		return null;
	}
	
	@Get("/arquivos/calendario")
	public Download downloadCalendario(String campus) {		
		try {
			if (campus == null) {
				throw new NullPointerException("Campus inválido!");
			}
			
			String path = context.getRealPath("/WEB-INF/files/");
			File relatorio = null;
			switch (campus) {
				case "CRAJUBAR":
					relatorio = new File(path+"/CalendarioAcademico-CRAJUBAR-20142.pdf");
					break;
				case "IGUATU_20142":
					relatorio = new File(path+"/CalendarioAcademico-IGUATU-20142-ED_FISICA.pdf");
					break;
				case "IGUATU_20151_EDFECN":
					relatorio = new File(path+"/CalendarioAcademico-IGUATU-2015.1-ECONOMIA-EDUCACAO FISICA.pdf");
					break;
				case "IGUATU_20151_ENFDIR":
					relatorio = new File(path+"/CalendarioAcademico-IGUATU-2015.1-DIREITO-ENFERMAGEM.pdf");
					break;	
				case "CAMPOS_SALES":
					relatorio = new File(path+"/CalendarioAcademico-CSALES-20142.pdf");
					break;
				case "MISSAO_VELHA":
					relatorio = new File(path+"/CalendarioAcademico-MVELHA-20151.pdf");
					break;		
				default:
					relatorio = new File(path+"/CalendarioAcademico-CRAJUBAR-20142.pdf");
					break;
			}
		
			return new FileDownload(relatorio, "application/pdf", "calendario_"+campus+".pdf", false);
		} catch(FileNotFoundException e) {
			result.include("mensagem", "Arquivo não encontrado no servidor!")
					.redirectTo(this).index();
		} catch(NullPointerException e) {
			result.include("mensagem", e.getMessage()).redirectTo(this).index();
		} catch(ObserverException e ) {
			result.include("mensagem", e.getMessage()).redirectTo(this).index();
		} 
		return null;
	}
	
	@PostConstruct
	public void getDisciplinasAluno() {
		
		String matricula = usuarioLogado.getAluno().getMatricula();
			
		if (matricula != null) {
			try { 
				List<HistoricoDisciplina> mListDisciplinas = new ArrayList<HistoricoDisciplina>();
				HistoricoDisciplina hd;
				
				List<DisciplinaMatriculada> mList = this.mMatriculasDAO.buscarPorMatricula(matricula);
				if (mList != null && !mList.isEmpty()) {
					for(DisciplinaMatriculada d: mList) {
							
						Oferta mOferta = null;
						Disciplina mdDisciplina = null;
						
						mOferta = mOfertaDAO.buscarPorOfertaPedido(
								d.getId().getCodOferta(), d.getId().getCodPedido());
						if (mOferta != null)
							mdDisciplina = mDisciplinaDAO.buscarPorId(
									mOferta.getCodDisciplina());
						
						hd = new HistoricoDisciplina();
						
						hd.setCodDisciplina((mOferta != null ? mOferta.getCodDisciplina() : ""));
						hd.setCreditos((mOferta != null ? mOferta.getTotalCreditos() : ""));
						
						hd.setNomeDisciplina(
								(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
						
						hd.setCodOferta(d.getId().getCodOferta());
						hd.setCodPedido(d.getId().getCodPedido());						
						hd.setMedia(d.getMedia());
						hd.setNotaAV1(d.getNotaAV1());
						hd.setNotaAV2(d.getNotaAV2());
						hd.setNotaAVF(d.getNotaAVF());
						hd.setSituacao(d.getSituacao().getDescricao());
						hd.setHorario(mOferta.getHorario());
						
						mListDisciplinas.add(hd);
						
					}	
				} else {
					List<DisciplinaCursada> mListCursadas = this.mCursadasDAO.buscarPorCodOfertaCursando(Paths.PERIODO_PADRAO, matricula);
					
					for(DisciplinaCursada d: mListCursadas) {
							
						Oferta mOferta = null;
						Disciplina mdDisciplina = null;
						
						mOferta = mOfertaDAO.buscarPorOfertaPedido(
								d.getId().getCodOferta(), d.getId().getCodPedido());
						if (mOferta != null) {
							
							mdDisciplina = mDisciplinaDAO.buscarPorId(mOferta.getCodDisciplina());
						
							hd = new HistoricoDisciplina();
							
							hd.setCodDisciplina((mOferta != null ? mOferta.getCodDisciplina() : ""));
							hd.setCreditos((mOferta != null ? mOferta.getTotalCreditos() : ""));
							
							hd.setNomeDisciplina(
									(mdDisciplina != null ? mdDisciplina.getNomeDisciplina() : "" ));
							
							hd.setCodOferta(d.getId().getCodOferta());
							hd.setCodPedido(d.getId().getCodPedido());	
							
							if (d.getSituacao().getCodSituacao().trim().equalsIgnoreCase("AF")) {
								hd.setMedia(null);
							} else {
								hd.setMedia(d.getMedia());
							}
							
							hd.setNotaAV1(d.getNotaAV1());
							hd.setNotaAV2(d.getNotaAV2());
							hd.setNotaAVF(d.getNotaAVF());
							hd.setSituacao(d.getSituacao().getDescricao());	
							hd.setHorario(mOferta.getHorario());
							
							mListDisciplinas.add(hd);	
						}
					}
				}
				
				this.result.include("listaMatriculas", 
							mListDisciplinas)
							.include("matricula", matricula)
							.include("aluno", usuarioLogado.getAluno().getAluno().getNome());
			} catch(Exception e) {
				this.result.include("mensagem","Matrícula inválida!")
					.redirectTo(this).index();
			}
		} else {
			this.result.include("mensagem","Matrícula não foi informada!")
				.redirectTo(this).index();
		}
	}
	
}